Spring Data JDBC 是 Spring 生態系統中的一個輕量級 ORM
框架
它提供了一種簡單而強大的方式來操作資料庫
將之前的 JDBC
依賴替換成 Spring Data JDBC
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
@Table
註解用來映射到資料庫的表,記得大小寫
要和資料庫一致,如果不指定表名稱,那麼預設的表名稱會是對應類別的名稱@Id
註解用於標記主鍵@Table("TODOS")
public class Todo {
@Id
private Long id;
private String title;
private boolean completed;
// 建構子、getter 和 setter
}
新增一個 TodoRepository
interface 來擴展 CrudRepository
public interface TodoRepository extends CrudRepository<Todo, Long> {
}
CrudRepository
是 Spring Data 專案中的一個核心介面,它提供了一組用於執行常見 CRUD
操作的方法
它有兩個泛型參數
Todo
:這是實體類別的類型。在這個例子中,表示我們要操作的是 Todo 類型的實體Long
:這是實體類別主鍵的類型。這裡表示 Todo 類的 @Id 欄位是 Long 類型透過擴展 CrudRepository
,我們的 TodoRepository
自動獲得了以下方法
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAllById(Iterable<? extends ID> ids);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
@RestController
@RequestMapping("/api/todos")
public class TodoController {
// 為了方便,在這裡只展示了修改後,所增加的 DB 操作相關程式碼
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping
public ResponseEntity<ApiResponse<Todo>> createTodo(@RequestBody Todo todo) {
Todo savedTodo = todoRepository.save(todo);
return ResponseEntity.ok(new ApiResponse<>(true, savedTodo, null));
}
@GetMapping
public ResponseEntity<ApiResponse<List<Todo>>> getAllTodos() {
List<Todo> todos = (List<Todo>) todoRepository.findAll();
return ResponseEntity.ok(new ApiResponse<>(true, todos, null));
}
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<Todo>> getTodo(@PathVariable Long id) {
return todoRepository.findById(id)
.map(todo -> ResponseEntity.ok(new MyApiResponse<>(true, todo, null)))
.orElse(createNotFoundError(id));
}
@PutMapping("/{id}")
public ResponseEntity<ApiResponse<Todo>> updateTodo(@PathVariable Long id, @RequestBody Todo updatedTodo) {
return todoRepository.findById(id)
.map(todo -> {
todo.setTitle(updatedTodo.getTitle());
todo.setCompleted(updatedTodo.isCompleted());
Todo savedTodo = todoRepository.save(todo);
return ResponseEntity.ok(new MyApiResponse<>(true, savedTodo, null));
})
.orElse(createNotFoundError(id));
}
@DeleteMapping("/{id}")
public ResponseEntity<ApiResponse<Void>> deleteTodo(@PathVariable Long id) {
if (todoRepository.existsById(id)) {
todoRepository.deleteById(id);
return ResponseEntity.ok(new MyApiResponse<>(true, null, null));
} else {
return createNotFoundError(id);
}
}
}
Spring Data JDBC 提供了更高層次的抽象和自動化,適合快速開發和簡單的數據模型
JdbcClient 則更靈活,適合需要精細控制 SQL 的場景
兩種方法都有其優點,不過,還有一個更強大的工具,可以讓我們在 Spring Boot 中操作資料庫,那就是 Spring Data JPA
後面就會介紹 Spring Data JPA
的相關功能
同步刊登於 Blog 「Spring Boot API 開發:從 0 到 1」Day 19 Spring Data JDBC
我的粉絲專頁
圖片來源:AI 產生